/*
 *  This file is part of the SIRIUS libraries for analyzing MS and MS/MS data
 *
 *  Copyright (C) 2024 Bright Giant GmbH
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License along with SIRIUS.  If not, see <http://www.gnu.org/licenses/>.
 *
 *  NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
 *  https://openapi-generator.tech
 *  Do not edit the class manually.
 */


package io.sirius.ms.sdk.model;

import java.util.Objects;
import java.util.Arrays;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonTypeName;
import com.fasterxml.jackson.annotation.JsonValue;
import io.sirius.ms.sdk.model.Canopus;
import io.sirius.ms.sdk.model.FingerprintPrediction;
import io.sirius.ms.sdk.model.MsNovelist;
import io.sirius.ms.sdk.model.Sirius;
import io.sirius.ms.sdk.model.SpectralLibrarySearch;
import io.sirius.ms.sdk.model.StructureDbSearch;
import io.sirius.ms.sdk.model.Zodiac;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;
import com.fasterxml.jackson.annotation.JsonTypeName;

/**
 * Object to submit a job to be executed by SIRIUS
 */
@JsonPropertyOrder({
  JobSubmission.JSON_PROPERTY_COMPOUND_IDS,
  JobSubmission.JSON_PROPERTY_ALIGNED_FEATURE_IDS,
  JobSubmission.JSON_PROPERTY_FALLBACK_ADDUCTS,
  JobSubmission.JSON_PROPERTY_ENFORCED_ADDUCTS,
  JobSubmission.JSON_PROPERTY_DETECTABLE_ADDUCTS,
  JobSubmission.JSON_PROPERTY_RECOMPUTE,
  JobSubmission.JSON_PROPERTY_SPECTRA_SEARCH_PARAMS,
  JobSubmission.JSON_PROPERTY_FORMULA_ID_PARAMS,
  JobSubmission.JSON_PROPERTY_ZODIAC_PARAMS,
  JobSubmission.JSON_PROPERTY_FINGERPRINT_PREDICTION_PARAMS,
  JobSubmission.JSON_PROPERTY_CANOPUS_PARAMS,
  JobSubmission.JSON_PROPERTY_STRUCTURE_DB_SEARCH_PARAMS,
  JobSubmission.JSON_PROPERTY_MS_NOVELIST_PARAMS,
  JobSubmission.JSON_PROPERTY_CONFIG_MAP
})
@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", comments = "Generator version: 7.14.0")
public class JobSubmission {
  public static final String JSON_PROPERTY_COMPOUND_IDS = "compoundIds";
  @jakarta.annotation.Nullable
  private List<String> compoundIds;

  public static final String JSON_PROPERTY_ALIGNED_FEATURE_IDS = "alignedFeatureIds";
  @jakarta.annotation.Nullable
  private List<String> alignedFeatureIds;

  public static final String JSON_PROPERTY_FALLBACK_ADDUCTS = "fallbackAdducts";
  @jakarta.annotation.Nullable
  private List<String> fallbackAdducts;

  public static final String JSON_PROPERTY_ENFORCED_ADDUCTS = "enforcedAdducts";
  @jakarta.annotation.Nullable
  private List<String> enforcedAdducts;

  public static final String JSON_PROPERTY_DETECTABLE_ADDUCTS = "detectableAdducts";
  @jakarta.annotation.Nullable
  private List<String> detectableAdducts;

  public static final String JSON_PROPERTY_RECOMPUTE = "recompute";
  @jakarta.annotation.Nullable
  private Boolean recompute;

  public static final String JSON_PROPERTY_SPECTRA_SEARCH_PARAMS = "spectraSearchParams";
  @jakarta.annotation.Nullable
  private SpectralLibrarySearch spectraSearchParams;

  public static final String JSON_PROPERTY_FORMULA_ID_PARAMS = "formulaIdParams";
  @jakarta.annotation.Nullable
  private Sirius formulaIdParams;

  public static final String JSON_PROPERTY_ZODIAC_PARAMS = "zodiacParams";
  @jakarta.annotation.Nullable
  private Zodiac zodiacParams;

  public static final String JSON_PROPERTY_FINGERPRINT_PREDICTION_PARAMS = "fingerprintPredictionParams";
  @jakarta.annotation.Nullable
  private FingerprintPrediction fingerprintPredictionParams;

  public static final String JSON_PROPERTY_CANOPUS_PARAMS = "canopusParams";
  @jakarta.annotation.Nullable
  private Canopus canopusParams;

  public static final String JSON_PROPERTY_STRUCTURE_DB_SEARCH_PARAMS = "structureDbSearchParams";
  @jakarta.annotation.Nullable
  private StructureDbSearch structureDbSearchParams;

  public static final String JSON_PROPERTY_MS_NOVELIST_PARAMS = "msNovelistParams";
  @jakarta.annotation.Nullable
  private MsNovelist msNovelistParams;

  public static final String JSON_PROPERTY_CONFIG_MAP = "configMap";
  @jakarta.annotation.Nullable
  private Map<String, String> configMap;

  public JobSubmission() {
  }

  public JobSubmission compoundIds(@jakarta.annotation.Nullable List<String> compoundIds) {
    
    this.compoundIds = compoundIds;
    return this;
  }

  public JobSubmission addCompoundIdsItem(String compoundIdsItem) {
    if (this.compoundIds == null) {
      this.compoundIds = new ArrayList<>();
    }
    this.compoundIds.add(compoundIdsItem);
    return this;
  }

  /**
   * Compounds that should be the input for this Job  Will be converted to the respective alignedFeatureIds for computation.   At least one compoundId or alignedFeatureId needs to be specified.
   * @return compoundIds
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_COMPOUND_IDS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public List<String> getCompoundIds() {
    return compoundIds;
  }


  @JsonProperty(JSON_PROPERTY_COMPOUND_IDS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setCompoundIds(@jakarta.annotation.Nullable List<String> compoundIds) {
    this.compoundIds = compoundIds;
  }

  public JobSubmission alignedFeatureIds(@jakarta.annotation.Nullable List<String> alignedFeatureIds) {
    
    this.alignedFeatureIds = alignedFeatureIds;
    return this;
  }

  public JobSubmission addAlignedFeatureIdsItem(String alignedFeatureIdsItem) {
    if (this.alignedFeatureIds == null) {
      this.alignedFeatureIds = new ArrayList<>();
    }
    this.alignedFeatureIds.add(alignedFeatureIdsItem);
    return this;
  }

  /**
   * Features (aligned over runs) that should be the input for this Job   At least one compoundId or alignedFeatureId needs to be specified.
   * @return alignedFeatureIds
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_ALIGNED_FEATURE_IDS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public List<String> getAlignedFeatureIds() {
    return alignedFeatureIds;
  }


  @JsonProperty(JSON_PROPERTY_ALIGNED_FEATURE_IDS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setAlignedFeatureIds(@jakarta.annotation.Nullable List<String> alignedFeatureIds) {
    this.alignedFeatureIds = alignedFeatureIds;
  }

  public JobSubmission fallbackAdducts(@jakarta.annotation.Nullable List<String> fallbackAdducts) {
    
    this.fallbackAdducts = fallbackAdducts;
    return this;
  }

  public JobSubmission addFallbackAdductsItem(String fallbackAdductsItem) {
    if (this.fallbackAdducts == null) {
      this.fallbackAdducts = new ArrayList<>();
    }
    this.fallbackAdducts.add(fallbackAdductsItem);
    return this;
  }

  /**
   * Describes how to deal with Adducts: Fallback adducts are considered if the auto detection did not find any indication for an ion mode.  Pos Examples: [M+H]+,[M]+,[M+K]+,[M+Na]+,[M+H-H2O]+,[M+Na2-H]+,[M+2K-H]+,[M+NH4]+,[M+H3O]+,[M+MeOH+H]+,[M+ACN+H]+,[M+2ACN+H]+,[M+IPA+H]+,[M+ACN+Na]+,[M+DMSO+H]+  Neg Examples: [M-H]-,[M]-,[M+K-2H]-,[M+Cl]-,[M-H2O-H]-,[M+Na-2H]-,M+FA-H]-,[M+Br]-,[M+HAc-H]-,[M+TFA-H]-,[M+ACN-H]-
   * @return fallbackAdducts
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_FALLBACK_ADDUCTS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public List<String> getFallbackAdducts() {
    return fallbackAdducts;
  }


  @JsonProperty(JSON_PROPERTY_FALLBACK_ADDUCTS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setFallbackAdducts(@jakarta.annotation.Nullable List<String> fallbackAdducts) {
    this.fallbackAdducts = fallbackAdducts;
  }

  public JobSubmission enforcedAdducts(@jakarta.annotation.Nullable List<String> enforcedAdducts) {
    
    this.enforcedAdducts = enforcedAdducts;
    return this;
  }

  public JobSubmission addEnforcedAdductsItem(String enforcedAdductsItem) {
    if (this.enforcedAdducts == null) {
      this.enforcedAdducts = new ArrayList<>();
    }
    this.enforcedAdducts.add(enforcedAdductsItem);
    return this;
  }

  /**
   * Describes how to deal with Adducts:  Enforced adducts that are always considered.  Pos Examples: [M+H]+,[M]+,[M+K]+,[M+Na]+,[M+H-H2O]+,[M+Na2-H]+,[M+2K-H]+,[M+NH4]+,[M+H3O]+,[M+MeOH+H]+,[M+ACN+H]+,[M+2ACN+H]+,[M+IPA+H]+,[M+ACN+Na]+,[M+DMSO+H]+  Neg Examples: [M-H]-,[M]-,[M+K-2H]-,[M+Cl]-,[M-H2O-H]-,[M+Na-2H]-,M+FA-H]-,[M+Br]-,[M+HAc-H]-,[M+TFA-H]-,[M+ACN-H]-
   * @return enforcedAdducts
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_ENFORCED_ADDUCTS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public List<String> getEnforcedAdducts() {
    return enforcedAdducts;
  }


  @JsonProperty(JSON_PROPERTY_ENFORCED_ADDUCTS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setEnforcedAdducts(@jakarta.annotation.Nullable List<String> enforcedAdducts) {
    this.enforcedAdducts = enforcedAdducts;
  }

  public JobSubmission detectableAdducts(@jakarta.annotation.Nullable List<String> detectableAdducts) {
    
    this.detectableAdducts = detectableAdducts;
    return this;
  }

  public JobSubmission addDetectableAdductsItem(String detectableAdductsItem) {
    if (this.detectableAdducts == null) {
      this.detectableAdducts = new ArrayList<>();
    }
    this.detectableAdducts.add(detectableAdductsItem);
    return this;
  }

  /**
   * Describes how to deal with Adducts: Detectable adducts which are only considered if there is an indication in the MS1 scan (e.g. correct mass delta).  Pos Examples: [M+H]+,[M]+,[M+K]+,[M+Na]+,[M+H-H2O]+,[M+Na2-H]+,[M+2K-H]+,[M+NH4]+,[M+H3O]+,[M+MeOH+H]+,[M+ACN+H]+,[M+2ACN+H]+,[M+IPA+H]+,[M+ACN+Na]+,[M+DMSO+H]+  Neg Examples: [M-H]-,[M]-,[M+K-2H]-,[M+Cl]-,[M-H2O-H]-,[M+Na-2H]-,M+FA-H]-,[M+Br]-,[M+HAc-H]-,[M+TFA-H]-,[M+ACN-H]-
   * @return detectableAdducts
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_DETECTABLE_ADDUCTS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public List<String> getDetectableAdducts() {
    return detectableAdducts;
  }


  @JsonProperty(JSON_PROPERTY_DETECTABLE_ADDUCTS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setDetectableAdducts(@jakarta.annotation.Nullable List<String> detectableAdducts) {
    this.detectableAdducts = detectableAdducts;
  }

  public JobSubmission recompute(@jakarta.annotation.Nullable Boolean recompute) {
    
    this.recompute = recompute;
    return this;
  }

  /**
   * Indicate if already existing result for a tool to be executed should be overwritten or not.
   * @return recompute
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_RECOMPUTE)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Boolean isRecompute() {
    return recompute;
  }


  @JsonProperty(JSON_PROPERTY_RECOMPUTE)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setRecompute(@jakarta.annotation.Nullable Boolean recompute) {
    this.recompute = recompute;
  }

  public JobSubmission spectraSearchParams(@jakarta.annotation.Nullable SpectralLibrarySearch spectraSearchParams) {
    
    this.spectraSearchParams = spectraSearchParams;
    return this;
  }

  /**
   * Get spectraSearchParams
   * @return spectraSearchParams
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_SPECTRA_SEARCH_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public SpectralLibrarySearch getSpectraSearchParams() {
    return spectraSearchParams;
  }


  @JsonProperty(JSON_PROPERTY_SPECTRA_SEARCH_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setSpectraSearchParams(@jakarta.annotation.Nullable SpectralLibrarySearch spectraSearchParams) {
    this.spectraSearchParams = spectraSearchParams;
  }

  public JobSubmission formulaIdParams(@jakarta.annotation.Nullable Sirius formulaIdParams) {
    
    this.formulaIdParams = formulaIdParams;
    return this;
  }

  /**
   * Get formulaIdParams
   * @return formulaIdParams
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_FORMULA_ID_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Sirius getFormulaIdParams() {
    return formulaIdParams;
  }


  @JsonProperty(JSON_PROPERTY_FORMULA_ID_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setFormulaIdParams(@jakarta.annotation.Nullable Sirius formulaIdParams) {
    this.formulaIdParams = formulaIdParams;
  }

  public JobSubmission zodiacParams(@jakarta.annotation.Nullable Zodiac zodiacParams) {
    
    this.zodiacParams = zodiacParams;
    return this;
  }

  /**
   * Get zodiacParams
   * @return zodiacParams
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_ZODIAC_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Zodiac getZodiacParams() {
    return zodiacParams;
  }


  @JsonProperty(JSON_PROPERTY_ZODIAC_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setZodiacParams(@jakarta.annotation.Nullable Zodiac zodiacParams) {
    this.zodiacParams = zodiacParams;
  }

  public JobSubmission fingerprintPredictionParams(@jakarta.annotation.Nullable FingerprintPrediction fingerprintPredictionParams) {
    
    this.fingerprintPredictionParams = fingerprintPredictionParams;
    return this;
  }

  /**
   * Get fingerprintPredictionParams
   * @return fingerprintPredictionParams
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_FINGERPRINT_PREDICTION_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public FingerprintPrediction getFingerprintPredictionParams() {
    return fingerprintPredictionParams;
  }


  @JsonProperty(JSON_PROPERTY_FINGERPRINT_PREDICTION_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setFingerprintPredictionParams(@jakarta.annotation.Nullable FingerprintPrediction fingerprintPredictionParams) {
    this.fingerprintPredictionParams = fingerprintPredictionParams;
  }

  public JobSubmission canopusParams(@jakarta.annotation.Nullable Canopus canopusParams) {
    
    this.canopusParams = canopusParams;
    return this;
  }

  /**
   * Get canopusParams
   * @return canopusParams
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_CANOPUS_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public Canopus getCanopusParams() {
    return canopusParams;
  }


  @JsonProperty(JSON_PROPERTY_CANOPUS_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setCanopusParams(@jakarta.annotation.Nullable Canopus canopusParams) {
    this.canopusParams = canopusParams;
  }

  public JobSubmission structureDbSearchParams(@jakarta.annotation.Nullable StructureDbSearch structureDbSearchParams) {
    
    this.structureDbSearchParams = structureDbSearchParams;
    return this;
  }

  /**
   * Get structureDbSearchParams
   * @return structureDbSearchParams
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_STRUCTURE_DB_SEARCH_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public StructureDbSearch getStructureDbSearchParams() {
    return structureDbSearchParams;
  }


  @JsonProperty(JSON_PROPERTY_STRUCTURE_DB_SEARCH_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setStructureDbSearchParams(@jakarta.annotation.Nullable StructureDbSearch structureDbSearchParams) {
    this.structureDbSearchParams = structureDbSearchParams;
  }

  public JobSubmission msNovelistParams(@jakarta.annotation.Nullable MsNovelist msNovelistParams) {
    
    this.msNovelistParams = msNovelistParams;
    return this;
  }

  /**
   * Get msNovelistParams
   * @return msNovelistParams
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_MS_NOVELIST_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)

  public MsNovelist getMsNovelistParams() {
    return msNovelistParams;
  }


  @JsonProperty(JSON_PROPERTY_MS_NOVELIST_PARAMS)
  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
  public void setMsNovelistParams(@jakarta.annotation.Nullable MsNovelist msNovelistParams) {
    this.msNovelistParams = msNovelistParams;
  }

  public JobSubmission configMap(@jakarta.annotation.Nullable Map<String, String> configMap) {
    
    this.configMap = configMap;
    return this;
  }

  public JobSubmission putConfigMapItem(String key, String configMapItem) {
    if (this.configMap == null) {
      this.configMap = new HashMap<>();
    }
    this.configMap.put(key, configMapItem);
    return this;
  }

  /**
   * As an alternative to the object based parameters, this map allows to store key value pairs  of ALL SIRIUS parameters. All possible parameters can be retrieved from SIRIUS via the respective endpoint.
   * @return configMap
   */
  @jakarta.annotation.Nullable
  @JsonProperty(JSON_PROPERTY_CONFIG_MAP)
  @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS)

  public Map<String, String> getConfigMap() {
    return configMap;
  }


  @JsonProperty(JSON_PROPERTY_CONFIG_MAP)
  @JsonInclude(content = JsonInclude.Include.ALWAYS, value = JsonInclude.Include.USE_DEFAULTS)
  public void setConfigMap(@jakarta.annotation.Nullable Map<String, String> configMap) {
    this.configMap = configMap;
  }


  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (o == null || getClass() != o.getClass()) {
      return false;
    }
    JobSubmission jobSubmission = (JobSubmission) o;
    return Objects.equals(this.compoundIds, jobSubmission.compoundIds) &&
        Objects.equals(this.alignedFeatureIds, jobSubmission.alignedFeatureIds) &&
        Objects.equals(this.fallbackAdducts, jobSubmission.fallbackAdducts) &&
        Objects.equals(this.enforcedAdducts, jobSubmission.enforcedAdducts) &&
        Objects.equals(this.detectableAdducts, jobSubmission.detectableAdducts) &&
        Objects.equals(this.recompute, jobSubmission.recompute) &&
        Objects.equals(this.spectraSearchParams, jobSubmission.spectraSearchParams) &&
        Objects.equals(this.formulaIdParams, jobSubmission.formulaIdParams) &&
        Objects.equals(this.zodiacParams, jobSubmission.zodiacParams) &&
        Objects.equals(this.fingerprintPredictionParams, jobSubmission.fingerprintPredictionParams) &&
        Objects.equals(this.canopusParams, jobSubmission.canopusParams) &&
        Objects.equals(this.structureDbSearchParams, jobSubmission.structureDbSearchParams) &&
        Objects.equals(this.msNovelistParams, jobSubmission.msNovelistParams) &&
        Objects.equals(this.configMap, jobSubmission.configMap);
  }

  @Override
  public int hashCode() {
    return Objects.hash(compoundIds, alignedFeatureIds, fallbackAdducts, enforcedAdducts, detectableAdducts, recompute, spectraSearchParams, formulaIdParams, zodiacParams, fingerprintPredictionParams, canopusParams, structureDbSearchParams, msNovelistParams, configMap);
  }

  @Override
  public String toString() {
    StringBuilder sb = new StringBuilder();
    sb.append("class JobSubmission {\n");
    sb.append("    compoundIds: ").append(toIndentedString(compoundIds)).append("\n");
    sb.append("    alignedFeatureIds: ").append(toIndentedString(alignedFeatureIds)).append("\n");
    sb.append("    fallbackAdducts: ").append(toIndentedString(fallbackAdducts)).append("\n");
    sb.append("    enforcedAdducts: ").append(toIndentedString(enforcedAdducts)).append("\n");
    sb.append("    detectableAdducts: ").append(toIndentedString(detectableAdducts)).append("\n");
    sb.append("    recompute: ").append(toIndentedString(recompute)).append("\n");
    sb.append("    spectraSearchParams: ").append(toIndentedString(spectraSearchParams)).append("\n");
    sb.append("    formulaIdParams: ").append(toIndentedString(formulaIdParams)).append("\n");
    sb.append("    zodiacParams: ").append(toIndentedString(zodiacParams)).append("\n");
    sb.append("    fingerprintPredictionParams: ").append(toIndentedString(fingerprintPredictionParams)).append("\n");
    sb.append("    canopusParams: ").append(toIndentedString(canopusParams)).append("\n");
    sb.append("    structureDbSearchParams: ").append(toIndentedString(structureDbSearchParams)).append("\n");
    sb.append("    msNovelistParams: ").append(toIndentedString(msNovelistParams)).append("\n");
    sb.append("    configMap: ").append(toIndentedString(configMap)).append("\n");
    sb.append("}");
    return sb.toString();
  }

  /**
   * Convert the given object to string with each line indented by 4 spaces
   * (except the first line).
   */
  private String toIndentedString(Object o) {
    if (o == null) {
      return "null";
    }
    return o.toString().replace("\n", "\n    ");
  }

}

